// 导入dayjs库
import dayjs from 'dayjs'
// 导入并扩展utc插件
import utc from 'dayjs/plugin/utc'
dayjs.extend(utc)
import { BASE_URL } from '@/utils/request/config'
const DATE_TIME_FORMAT = 'YYYY-MM-DD HH:mm:ss'

/**
 * 将UTC时间格式化为指定格式的本地时间
 * @param utcDate UTC时间字符串
 * @param format 格式化模板，默认为'YYYY-MM-DD HH:mm:ss'
 * @returns 格式化后的时间字符串
 */
export function utcToDateTimeFormat(
     utcDate: string,
     format: string = DATE_TIME_FORMAT,
): string {
     return dayjs.utc(utcDate).utcOffset(8).format(format)
}

/**
 * 获取当前时间，格式为'YYYY-MM-DD HH:mm:ss'
 * @returns 当前时间字符串
 */
export function getCurrentTime(): string {
     return dayjs().format(DATE_TIME_FORMAT)
}

/**
 * 将Date对象格式化为指定格式的时间字符串
 * @param time Date对象
 * @param type 格式化类型，可选'y-m-d'或默认格式
 * @returns 格式化后的时间字符串
 */
export const formateDate = (time: Date, type: string = 'yyy-mm-dd'): string => {
     // 使用原生方法将时间转换为指定格式
     const y = time.getFullYear()
     let m = String(time.getMonth() + 1)
     m = m.padStart(2, '0')
     let d = String(time.getDate())
     d = d.padStart(2, '0')
     let h = String(time.getHours())
     h = h.padStart(2, '0')
     let minute = String(time.getMinutes())
     minute = minute.padStart(2, '0')
     let second = String(time.getSeconds())
     second = second.padStart(2, '0')

     if (type === 'yyy-mm-dd') {
          return `${y}-${m}-${d}`
     } else {
          return `${y}-${m}-${d} ${h}:${minute}:${second}`
     }
}

/**
 * 时间格式修改，可增加指定秒数
 * @param onvaltime 输入的日期字符串
 * @param num 要增加的秒数，默认为0
 * @returns 格式化后的时间字符串
 */
export const timesjxg = (onvaltime: string, num: number = 0): string => {
     // 将输入的日期字符串转换为Date对象
     const inputDate = new Date(onvaltime)
     // 增加时间
     inputDate.setSeconds(inputDate.getSeconds() + num)
     // 将日期对象转换为指定格式的字符串  yyy-mm-dd hh:mm:ss
     return formateDate(inputDate)
}

/**
 * 将时间字符串格式化为指定格式
 * @param timeString 时间字符串
 * @param type 格式化类型，可选'yyyy-mm-dd hh:mm:ss'、'yyyy-mm-dd hh:mm'、'yyyy-mm-dd'
 * @returns 格式化后的时间字符串
 */
export const formatDate = (
     timeString: string,
     type: string = 'yyyy-mm-dd hh:mm:ss',
): string => {
     if (!timeString) return ''
     const date = new Date(timeString)
     const year = date.getFullYear()
     const month = String(date.getMonth() + 1).padStart(2, '0')
     const day = String(date.getDate()).padStart(2, '0')
     const hour = String(date.getHours()).padStart(2, '0')
     const minute = String(date.getMinutes()).padStart(2, '0')
     const second = String(date.getSeconds()).padStart(2, '0')

     if (type === 'yyyy-mm-dd hh:mm:ss') {
          return `${year}-${month}-${day} ${hour}:${minute}:${second}`
     } else if (type === 'yyyy-mm-dd hh:mm') {
          return `${year}-${month}-${day} ${hour}:${minute}`
     } else if (type === 'yyyy-mm-dd') {
          return `${year}-${month}-${day}`
     } else {
          return ''
     }
}

/**
 * 将Date对象转换为字符串格式
 * @param current Date对象或其他类型
 * @returns 格式化后的时间字符串或原始值
 */
export const dateToString = (current: Date | string): string => {
     if (!(current instanceof Date)) {
          return current
     }
     const o = {
          y: current.getFullYear(),
          m: current.getMonth() + 1,
          d: current.getDate(),
          h: current.getHours(),
          mi: current.getMinutes(),
          s: current.getSeconds(),
          q: Math.floor((current.getMonth() + 3) / 3),
          S: current.getMilliseconds(),
     }

     if (o.m <= 9 && o.d <= 9) {
          return `${o.y}-0${o.m}-0${o.d} ${o.h}:${o.mi}:${o.s}`
     } else if (o.d <= 9) {
          return `${o.y}-${o.m}-0${o.d} ${o.h}:${o.mi}:${o.s}`
     } else if (o.m <= 9) {
          return `${o.y}-0${o.m}-${o.d} ${o.h}:${o.mi}:${o.s}`
     }
     return `${o.y}-${o.m}-${o.d} ${o.h}:${o.mi}:${o.s}`
}

/**
 * 将里程数据格式化为K格式
 * @param mileage 里程数据，可以是字符串或数字
 * @returns 格式化后的里程字符串
 */
export const parseMileage = (mileage: string | number): string => {
     let res = ''
     const mile = Number(mileage)
     if (!Number.isNaN(mile)) {
          res = `K${Math.floor(mile / 1000)}+${(mile % 1000).toFixed(0).padStart(3, '0')}`
     }
     return res
}
/**
 * 将秒数转换为时分秒格式
 * @param seconds 秒数
 * @returns 格式化后的时间字符串
 */
export const convertSecondsToTime = (seconds: number): string => {
     if (isNaN(seconds) || seconds < 0) return '00:00'
     const hours = Math.floor(seconds / 3600)
     const minutes = Math.floor((seconds % 3600) / 60)

     return `${hours.toString().padStart(2, '0')}小时 ${minutes.toString().padStart(2, '0')}分钟`
}

/**
 * 将时间戳转换为日期格式
 * @param timestamp 时间戳（毫秒）
 * @returns 格式化后的日期字符串
 */
export const convertTimestampToDate = (timestamp: number): string => {
     const date = new Date(timestamp)
     const year = date.getFullYear()
     const month = (date.getMonth() + 1).toString().padStart(2, '0')
     const day = date.getDate().toString().padStart(2, '0')
     const hour = date.getHours().toString().padStart(2, '0')
     const minute = date.getMinutes().toString().padStart(2, '0')
     const second = date.getSeconds().toString().padStart(2, '0')

     return `${year}-${month}-${day} ${hour}:${minute}:${second}`
}

/**
 * 使用dayjs格式化时间字符串
 * @param time 时间字符串
 * @param format 格式化模板，默认为'YYYY-MM-DD HH:mm:ss'
 * @returns 格式化后的时间字符串
 */
export const formatTime = (
     time: string,
     format: string = 'YYYY-MM-DD HH:mm:ss',
): string => {
     if (!time) return ''

     const date = dayjs(time)
     return date.isValid() ? date.format(format) : ''
}
// 转换服务器文件地址
/**
 * ../App_Data/UploadFiles/LWHJPICS/11/1.png =>
 *  http://172.18.84.157:9610/api/App_Data/UploadFiles/LWHJPICS/11/1.png
 */
export function parseFilePath(path: string): string {
     if (!path) return ''
     const res = path
     const reg = /^~\//
     return res.replace(reg, BASE_URL + '')
}

export function parsefilePath(path: string): string {
     if (!path) return ''
     const res = path
     return res.replace('~/', BASE_URL + '/')
}

export function parsefilePathTwo(path: string): string {
     if (!path) return ''
     const res = path
     return BASE_URL + res
}
/**
 * 将base64转换为File对象
 * @param {string} base64 - base64字符串
 * @param {string} filename - 文件名
 * @param {string} mimeType - 文件类型，如 'image/png'
 * @returns {File}
 */
export function base64ToFile(base64: any, filename: any, mimeType: any) {
     // 移除base64前缀（如果有）
     const base64Data = base64.split(',')[1] || base64

     // 转换为字节数组
     const byteString = atob(base64Data)
     const byteNumbers = new Array(byteString.length)

     for (let i = 0; i < byteString.length; i++) {
          byteNumbers[i] = byteString.charCodeAt(i)
     }

     const byteArray = new Uint8Array(byteNumbers)

     // 创建Blob对象
     const blob = new Blob([byteArray], { type: mimeType })

     // 转换为File对象
     return new File([blob], filename, { type: mimeType })
}
/**
 * 将File对象转换为Base64字符串
 * @param file File对象
 * @returns Promise<string> 返回base64字符串
 */
export function fileToBase64(file: File): Promise<string> {
     return new Promise((resolve, reject) => {
          const reader = new FileReader()

          reader.onload = () => {
               // 读取结果为base64字符串
               const base64String = reader.result as string
               resolve(base64String)
          }

          reader.onerror = (error) => {
               reject(error)
          }

          // 开始读取文件
          reader.readAsDataURL(file)
     })
}
